package coder.nav.java;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * HTML解析工具类（原生Java实现）
 */
public class HtmlUtils {

    /**
     * 获取指定标签的内容（单个）
     * @param html HTML内容
     * @param tagName 标签名（如div、a等）
     * @return 第一个匹配的标签内容（包含标签本身）
     */
    public static String getTag(String html, String tagName) {
        Pattern pattern = Pattern.compile("<" + tagName + "[^>]*>(.*?)</" + tagName + ">", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(html);
        if (matcher.find()) {
            return matcher.group(0);
        }
        return null;
    }

    /**
     * 获取指定标签的内容（多个）
     * @param html HTML内容
     * @param tagName 标签名
     * @return 所有匹配的标签内容列表
     */
    public static List<String> getTags(String html, String tagName) {
        List<String> tags = new ArrayList<>();
        Pattern pattern = Pattern.compile("<" + tagName + "[^>]*>(.*?)</" + tagName + ">", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(html);
        while (matcher.find()) {
            tags.add(matcher.group(0));
        }
        return tags;
    }

    /**
     * 获取指定标签的纯文本内容（去除HTML标签）
     * @param html HTML内容
     * @param tagName 标签名
     * @return 标签内的纯文本内容
     */
    public static String getTagText(String html, String tagName) {
        String tag = getTag(html, tagName);
        if (tag != null) {
            return tag.replaceAll("<[^>]+>", "");
        }
        return null;
    }

    /**
     * 获取指定标签的所有纯文本内容
     * @param html HTML内容
     * @param tagName 标签名
     * @return 所有匹配标签的纯文本内容列表
     */
    public static List<String> getTagsText(String html, String tagName) {
        List<String> texts = new ArrayList<>();
        List<String> tags = getTags(html, tagName);
        for (String tag : tags) {
            texts.add(tag.replaceAll("<[^>]+>", ""));
        }
        return texts;
    }

    /**
     * 获取指定标签的属性值
     * @param html HTML内容
     * @param tagName 标签名
     * @param attribute 属性名
     * @return 属性值
     */
    public static String getAttribute(String html, String tagName, String attribute) {
        Pattern pattern = Pattern.compile("<" + tagName + "[^>]*" + attribute + "=\"([^\"]*)\"[^>]*>", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(html);
        if (matcher.find()) {
            return matcher.group(1);
        }
        return null;
    }

    /**
     * 获取指定标签的所有属性值
     * @param html HTML内容
     * @param tagName 标签名
     * @param attribute 属性名
     * @return 所有匹配的属性值列表
     */
    public static List<String> getAttributes(String html, String tagName, String attribute) {
        List<String> attributes = new ArrayList<>();
        Pattern pattern = Pattern.compile("<" + tagName + "[^>]*" + attribute + "=\"([^\"]*)\"[^>]*>", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(html);
        while (matcher.find()) {
            attributes.add(matcher.group(1));
        }
        return attributes;
    }

    /**
     * 获取指定ID的标签内容
     * @param html HTML内容
     * @param id ID属性值
     * @return 匹配的标签内容
     */
    public static String getElementById(String html, String id) {
        Pattern pattern = Pattern.compile("<[^>]*id=\"" + id + "\"[^>]*>(.*?)</[^>]*>", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(html);
        if (matcher.find()) {
            return matcher.group(0);
        }
        return null;
    }

    /**
     * 获取指定class的标签内容
     * @param html HTML内容
     * @param className class属性值
     * @return 所有匹配的标签内容列表
     */
    public static List<String> getElementsByClass(String html, String className) {
        List<String> elements = new ArrayList<>();
        Pattern pattern = Pattern.compile("<[^>]*class=\"" + className + "\"[^>]*>(.*?)</[^>]*>", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(html);
        while (matcher.find()) {
            elements.add(matcher.group(0));
        }
        return elements;
    }

    /**
     * 获取指定属性的标签内容
     * @param html HTML内容
     * @param attributeKey 属性
     * @param attributeValue 属性值
     * @return 所有匹配的标签内容列表
     */
    public static List<String> getElementsByAttribute(String html, String attributeKey, String attributeValue) {
        List<String> attributes = new ArrayList<>();
        Pattern pattern = Pattern.compile("<" + attributeKey + "[^>]*" + attributeValue + "=\"([^\"]*)\"[^>]*>", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(html);
        while (matcher.find()) {
            attributes.add(matcher.group(1));
        }
        return attributes;
    }

    /**
     * 去除HTML标签，只保留纯文本
     * @param html HTML内容
     * @return 纯文本内容
     */
    public static String getPlainText(String html) {
        return html.replaceAll("<[^>]+>", "");
    }

    /**
     * 获取所有链接（a标签的href属性）
     * @param html HTML内容
     * @return 所有链接列表
     */
    public static List<String> getAllLinks(String html) {
        return getAttributes(html, "a", "href");
    }

    /**
     * 获取所有图片链接（img标签的src属性）
     * @param html HTML内容
     * @return 所有图片链接列表
     */
    public static List<String> getAllImages(String html) {
        return getAttributes(html, "img", "src");
    }

}